import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'// 使用模拟数据时，添加自定义request header 报错
import { Loading } from 'element-ui'

// create an axios instance
const service = axios.create({
  baseURL: process.env.BASE_API,
  timeout: 8000 // request timeout
})
const loadingOptions = { // http加载条配置
  fullscreen: true,
  background: 'rgba(0,0,0,0)'
}
var loadingInstance
// request interceptor
service.interceptors.request.use(config => {
  loadingInstance = Loading.service(loadingOptions)
  setTimeout(() => {
    loadingInstance.close()
  }, 8000)
  /**
   * http 请求前，对url 进行处理： 两种数据可配置切换 1.模拟数据、 2.其他测试数据
   * 定义切换规则
   * 数据源配置文件为/config/dev.env.js ; MOCK_BASE_API 参数值为模拟数据源配置， BASE_API 为其他数据源配置（本地开发服务器或者部署服务器）
   * 当 请求url 中, 最后一个关键词为 /mock 时, url 切换为模拟数据
   * 示例：/system/user/mock ;最后一个关键词/mock 时，切换数据源为 MOCK_BASE_API 模拟数据源
   * 正常：/system/user ; 请求切换数据源为 BASE_API 其他测试数据
   */
  if (config.url) {
    const keyArr = config.url.split('/')
    const lastKeyWord = keyArr[keyArr.length - 1]
    if (lastKeyWord === 'mock') {
      config.baseURL = process.env.MOCK_BASE_API
      config.url = config.url.split('/mock')[0]
    } else {
      config.baseURL = process.env.BASE_API
      if (store.getters.token) {
        config.headers['X-Auth-Token'] = getToken() // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
      }
    }
  }

  /**
   * 对分页参数进行统一处理
   * 判断参数中是否存在 page 属性
   * 如果存在则封装分页对象进行前后端进行交互
   */
  if (config.params) {
    if (config.params.page) {
      config.params['page.page'] = config.params.page
      delete config.params.page
      if (config.params.pageSize) {
        config.params['page.size'] = config.params.pageSize
        delete config.params.pageSize
      } else {
        config.params['page.size'] = store.state.beneform4j.pageSize
      }
    }
  }
  return config
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

// respone interceptor
service.interceptors.response.use(
  response => {
    loadingInstance.close()
    if (!response.data.hasOwnProperty('success')) {
      return response
    }
    if (response.data.success) {
      return Promise.resolve(response.data, response)
    } else {
      // res.code !== 20000 TODO 处理其他业务状态
      const code = response.data.code

      if (code === '000011') { // 000011
        // 会话超时特殊处理
        store.dispatch('ToggleOnlineStatus')
        return
      }
      Message({
        message: response.data.message,
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.resolve(response.data, response)
    }
  },
  error => {
    /**
     * 登录成功后获取菜单数据，请求错误时，对这条请求做特殊处理
     * 当请求菜单数据异常时，判定为会话超时
     */
    loadingInstance.close()
    if (error.request) {
      const reqUrl = error.request.custom.url
      if (reqUrl.indexOf('/menus/0') > -1) {
        Message({
          message: '会话超时，请重新登录',
          type: 'error',
          duration: 5 * 1000
        })
        store.dispatch('FedLogOut').then(() => {
          // location.reload()
        })
        return Promise.reject(error)
      }
      Message({
        message: error.message,
        type: 'error',
        duration: 5 * 1000
      })
    }
    return Promise.reject(error)
  })

export default service
